﻿Imports System.IO
Public Class GestionarPedidos
    ''' <summary>
    ''' Añade, graba, borra y modifica los pedidos en el fichero
    ''' </summary>
    ''' <remarks></remarks>
    Private ruta As String = My.Application.Info.DirectoryPath
    Private _Pedidos As New List(Of Pedido)

    ''' <summary>
    ''' Pedidos que tenemos en nuestro sistema
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public ReadOnly Property Pedidos As ObjectModel.ReadOnlyCollection(Of Pedido)
        Get
            Return _Pedidos.AsReadOnly
        End Get
    End Property

    ''' <summary>
    ''' Constructor que extrae los Pedidos del archivo Pedidos.txt
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub New()
        If Not File.Exists(ruta & "\Pedidos.txt") Then Exit Sub 'Comienza con la lista vacía
        Dim fichero As StreamReader = Nothing
        Try
            fichero = New StreamReader(ruta & "\Pedidos.txt")

            Do Until fichero.EndOfStream
                Dim linea As String = fichero.ReadLine 'Recoge toda la línea
                Dim datosGenerales() As String = linea.Split("|")
                Dim cabeceraPedido() As String = datosGenerales(0).Split("*")
                Dim datosProductos() As String = {}
                Dim listaProductoPedido As New List(Of ProductoPedido)
                For i As Integer = 1 To datosGenerales.Length - 1
                    datosProductos = datosGenerales(i).Split("*")
                    listaProductoPedido.Add(New ProductoPedido(datosProductos(0), Decimal.Parse(datosProductos(1)), datosProductos(2)))
                Next
                _Pedidos.Add(New Pedido(cabeceraPedido(0), Date.Parse(cabeceraPedido(1)), listaProductoPedido))
            Loop
        Catch ex As Exception
        Finally
            fichero.Close()
        End Try
    End Sub

    ''' <summary>
    ''' Añade los Pedidos a la Lista
    ''' </summary>
    ''' <param name="pedido">Pedido</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function AñadirLista(ByVal pedido As Pedido) As String
        If pedido Is Nothing AndAlso pedido.FechaPedido < Today AndAlso pedido.NombreCliente Is Nothing AndAlso pedido.ListaProductos.Count = 0 Then Return "No se puede agregar"
        If _Pedidos.Contains(pedido) Then Return "El pedido del cliente " & pedido.NombreCliente & " realizado en " & pedido.FechaPedido & " ya existe"
        If pedido.ListaProductos.Count = 0 Then Return "Por lo menos tiene que hace el pedido de 1 producto"
        _Pedidos.Add(pedido)
        Return ""
    End Function

    ''' <summary>
    ''' Grabamos la lista en el archivo Pedidos.txt
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function Grabar() As String
        Dim fichero As StreamWriter = Nothing
        Try
            fichero = New StreamWriter(ruta & "\Pedidos.txt")
            For Each pedido In _Pedidos
                Dim texto As String = pedido.NombreCliente & "*" & pedido.FechaPedido
                For i As Integer = 0 To pedido.ListaProductos.Count - 1
                    texto = texto & "|" & pedido.ListaProductos(i).Nombre & "*" & pedido.ListaProductos(i).Precio & "*" & pedido.ListaProductos(i).Cantidad
                Next
                fichero.WriteLine(texto)
            Next
        Catch ex As Exception
            fichero.Close()
            Return ex.Message
        Finally
            fichero.Close()
        End Try
        Return ""
    End Function
    ''' <summary>
    ''' Nos dan el Pedido que debemos agregar a la Lista
    ''' </summary>
    ''' <param name="pedido">Pedido</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Añadir(ByVal pedido As Pedido) As String
        Dim men As String = AñadirLista(pedido)
        If men = "" Then Grabar()
        Return men
    End Function

    ''' <summary>
    ''' Borrar Lista Pedidos
    ''' </summary>
    ''' <param name="nombreCliente">Nombre del cliente</param>
    ''' <param name="fechaPedido">Fecha en la que se realizo el pedido</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function BorrarPedido(ByVal nombreCliente As String, ByVal fechaPedido As Date) As String
        Dim pedido As New Pedido(nombreCliente, fechaPedido)
        If Not _Pedidos.Contains(pedido) Then Return "No existe el pedido de " & pedido.NombreCliente
        pedido = _Pedidos(_Pedidos.IndexOf(pedido))
        _Pedidos.Remove(pedido)
        Return ""
    End Function

    ''' <summary>
    ''' Borrar un Pedido
    ''' </summary>
    ''' <param name="nombre">Nombre del pedido</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Borrar(ByVal nombre As String, ByVal fecha As Date) As String
        Dim men As String = BorrarPedido(nombre, fecha)
        If men = "" Then Grabar()
        Return men
    End Function
End Class
